3-2 g MATLAB Is C ヾGem

首先,為什麼要撰寫一個 C 函數來讓 MATLAB 呼叫呢?我們可以將可能的原因列舉如下:

  1. 用 MATLAB 編寫的程式碼可能執行效率不佳,因此我們希望能以 C 程式碼來改進。這種種情況可能發生在MATLAB的 JIT 加速器無法有效地加速您的程式碼,或是您的演算法無法改成向量化的程式碼。
  2. 您希望使用 MATLAB 來進行繪圖以顯示 C 程式碼的效果,同時也希望此 C 程式碼可以用在原來的應用程式以及 MATLAB,達到「一魚兩吃」的效果。
  3. 您希望隱藏您的程式碼,以保護智慧財產權。C 的原始碼經編譯後,已變成二進位碼,雖然 MATLAB 能夠呼叫它,但是其他使用者已經無法看到原始程式碼了。(使用 pcode 命令,也可以達到同樣的功能。)
  4. 在轉換至 MATLAB 之前,您已經有很多可正確工作的 C 程式碼,但您不想將它們全部改寫成 MATLAB 程式碼,只希望能在 MATLAB 的環境下呼叫這些 C 程式碼。
  5. 您想要進行其它任何只有在 C 程式能做到的事,例如:
    • 更改呼叫端之工作空間的變數。
    • 須產生常駐記憶體(Persistent Memory)的資料,亦即產生在函數結束後,仍能讓其它函數或 MATLAB 存取的資料結構或變數。
    • 串接埠(Serial Port)資料的傳送和接收。
    • Device Drivers 等。

Hint
使用 pcode 指令,也可以將一般 M 檔案轉換成二進制檔案,達到隱藏原始程式碼的功能,但是此方法並無法大幅提高程式碼的執行效率。

在以下的介紹中,作者用的電腦作業平台是微軟公司的 64-bit Windows 7,所用的 C 編譯器是微軟公司的 Visual C/C++,如果讀者使用的電腦作業平台或編譯器和作者用的不同,可能實際步驟就會略有差異,此時讀者就可以參考第一節所提到的 API 手冊。

在撰寫 C 函數之前,首先必須選擇一個 C 編譯器來編譯將來完成的 C 函數,做法很簡單,就是直接在 MATLAB 指令視窗內輸入「mex -setup」,讓您選擇已安裝在電腦上的 C 編譯器:

>> mex -setup Welcome to mex -setup. This utility will help you set up a default compiler. For a list of supported compilers, see http://www.mathworks.com/support/compilers/R2011a/win64.html Please choose your compiler for building MEX-files: Would you like mex to locate installed compilers [y]/n? 接著,可以直接按下 「Enter」 鍵,此時會畫面出現的文字如下: Select a compiler: [1] Microsoft Visual C++ 2010 in C:\Program Files (x86)\Microsoft Visual Studio 10.0 [2] Microsoft Visual C++ 2008 SP1 in c:\Program Files (x86)\Microsoft Visual Studio 9.0 [0] None Compiler: 如前述及,筆者選用的 C 編譯器是微軟公司的 Visual C/C++,所以接著輸入「1」後,再按「Enter」鍵確認,即完成設定。

如果 DOS 視窗並無顯示可供選擇的 C 編譯器,那就表示電腦尚未安裝 C 編譯器,此時就必須先安裝 C 編譯器(例如:Microsoft Visual C/C++、Watcom C/C++、Borland C 等)才能進行下一步的測試。

如果現在已完成上述選擇 C 編譯器的程序, 下一步就可以測試 C 程式的編譯。MATLAB 有一個現成的 C 程式碼 yprime.c,其位置在:

{MATLAB root}\extern\examples\mex\yprime.c

其中 {MATLAB root} 是 MATLAB 的安裝目錄,如果你不知道此目錄名稱,可以在 MATLAB 命令視窗輸入 matlabroot,就可以顯示此安裝目錄。

在測試編譯之前,必須先將此檔案 yprime.c 拷貝至目前目錄,才可進行測試:

>> cd D:\matlabBook\MATLAB程式設計:進階篇\03-應用程式介面 >> copyfile([matlabroot, '\extern\examples\mex\yprime.c']) (若在執行 copyfile 指令時產生錯誤訊息,通常表示目前目錄下已經有 yprime.c 檔案。)此時此檔案應該已經在目前目錄下,我們就可以在 MATLAB 指令視窗,輸入下列敘述來編譯此 C 程式: >> mex yprime.c 此時 MATLAB 即會呼叫 Visual C/C++(先前所選的 C 編譯器)來編譯 yprime.c。若無任何錯誤訊息,在編譯完成之後,C 編譯器會產生對應的可執行檔案,檔名可能是 yprime.mexw32 或 yprime.mexw64,此即為 MATLAB 可呼叫的 C 函數。

Hint
在 MATLAB 7.1 之前,所產生的檔案是 yprime.dll,但從 MATLAB 7.1(含)之後,所產生的檔案是 yprime.mexw32(32-bit 視窗平台)或 yprime.mexw64(64-bit 視窗平台)。

欲知此函數所在的位置,可輸入如下:

>> which yprime D:\matlabBook\MATLAB程式設計:進階篇\03-應用程式介面\yprime.mexw64 (上述結果是根據 64-bit Windows 7、MATLAB R2011a)。亦可測試其執行如下: >> yprime(1, 1:4) ans = 2.0000 8.9685 4.0000 -1.0947 此種「 MATLAB 可呼叫的可執行檔」通稱為「MEX 檔案」,這是因為在其它電腦平台上,大部份都以 mex 為此編譯後的可執行檔副檔名的一部份,茲列表如下:

平台MEX 檔案的副檔名
Sun OS 4. xmex4
HP 9000/series 700mexhp7
Alphamexds
SGImexsg
SGI 64mexsg64
IBM RS/6000mexrs6
Linux (32-bit)mexglx
Linux (64-bit)mexa64
64-bit Solaris SPARCmexs64
Microsoft Windows (32-bit)dll(MATLAB7.1前),mexw32(MATLAB 7.1或更新)
Microsoft Windows (64-bit)dll(MATLAB7.1前),mexw64(MATLAB 7.1或更新)
Macintosh (PPC)mexmac
Macintosh (Intel)mexmaci

如果您已經設定完成 C 編譯器的設定,而且可以編譯 yprime.c,那麼我們就可以開始編寫各式各樣功能強大的 MEX 檔案了!


MATLAB程式設計:進階篇